package demo1;

import org.junit.Test;
import org.w3c.dom.ls.LSException;

import java.util.*;

/**
 * @description:泛型的使用
 * 泛型集合中使用泛型：
 * 1：集合接口或集合类在jdk5.0时都修改为带泛型的结构。
 * 2：在实例化集合类时，可以指明具体的泛型类型
 * 3：指明完以后，在集合类或接口中凡是定义类或接口时，内部结构使用到类的泛型的位置，都指定为实例化时的类型
 * 比如：add(E e) ----->实例化以后add（Integer e)
 * 4:注意点：泛型的类型必须是一个类，不能是基本数据类型。需要用到基本数据类型的位置，拿包装类替换
 * 5：如果实例化时，没有指明泛型的类型。默认类型为java.lang.Object类型。
 *
 * @author:Mr.Cat
 * @create:2021-11-01 09:26
 **/
public class GenericTest {

    //在集合中使用泛型之前的情况：
    @Test
    public void test1(){
        ArrayList list = new ArrayList();
        //需求：存放学生成绩
        list.add(56);
        list.add(98);
        list.add(87);
        list.add(64);

        //问题一:类型不安全
        //list.add("Tom");此代码会导致下面报错

        for(Object score:list){
            //问题二：强转时，可能出现ClassCastExceeption
            int score1 = (int) score;
            System.out.println(score1);
        }
    }
    //在集合中使用泛型的情况：
    @Test
    public void test2(){
        ArrayList<Integer> list = new ArrayList<Integer>();
        list.add(132);
        list.add(456);
        list.add(785);
        list.add(165);
        //编译时就会进行类型坚持，保证数据的安全
        //list.add("Tom");

        //方式一：
//        for (Integer score:list){
//            //避免了强转操作
//            int stuScore = score;
//
//            System.out.println(stuScore);
//
//        }

        //方式二：
        Iterator<Integer> iterator = list.iterator();
        while (iterator.hasNext()){
            int stuScore = iterator.next();
            System.out.println(stuScore);
        }
    }

    //在集合中使用泛型的情况：HashMap为例
    @Test
    public void test3(){
        Map<String, Integer> map = new HashMap<>();
        map.put("AA",23);
        map.put("Tom",30);
        map.put("Jack",64);

        //泛型的嵌套
        Set<Map.Entry<String, Integer>> entry = map.entrySet();
        Iterator<Map.Entry<String, Integer>> iterator = entry.iterator();
        while (iterator.hasNext()){
            Map.Entry<String, Integer> next = iterator.next();
            String key = next.getKey();
            Integer value = next.getValue();
            System.out.println(key+"---"+value);
        }


    }
}

